#pragma once
/***************************************************
 *封装一个sqlite_Helper
 主要封装接口:
    1.创建/打开数据库
    2.执行语句(主要是表的操作，数据的操作)
    3.关闭库
****************************************************/

#include <vector>
#include <iostream>
#include <string>
#include <functional>
#include <sqlite3.h>

typedef int(*callback) (void *, int, char **, char **);
class SqliteHelper
{
public:
    SqliteHelper(const std::string &dbfile)
        : _dbfile(dbfile), _handler(nullptr)
    {
    }

    // 打开可读可写的文件,不存在就创建
    bool Open(int safe_leve = SQLITE_OPEN_FULLMUTEX /*默认串行化*/)
    {
        // int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs )
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_leve, nullptr);
         if (ret != SQLITE_OK)
        {
            std::cout << "创建/打开sqlite数据库失败: ";
            std::cout << "sql :" << _dbfile << " ,执行语句" << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    // 执行语句
    bool Exec(const std::string &sql, callback cb, void *arg)
    {
        // int sqlite3_exec(sqlite3*, char *sql, int (*callback)(void*,int,char**,char**),  void* arg, char **err)
        int ret = sqlite3_exec(_handler, sql.c_str(),cb , arg, nullptr);
        if (ret != SQLITE_OK)
        {
            std::cout << "sql :" << _dbfile << " ,执行语句" << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

    // 关闭
    void Close()
    {
        if (_handler) 
            sqlite3_close_v2(_handler); 
    }

private:
    std::string _dbfile;
    sqlite3 *_handler;
};



